package case12

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"gorm.io/gorm/schema"
	"log"
	"os"
	"time"
)

func Test() {
	fmt.Println("🎯示例十二：多对多关系-自定义连接表")

	db, err := mysqlConnect()
	if err != nil {
		fmt.Println(err)
		return
	}

	if err := db.AutoMigrate(&UserCase12{}, &RoleCase12{}, &UserRoleCase12{}); err != nil {
		fmt.Println("自动创建结构失败：", err)
		return
	}

	//// 1. 创建角色
	//roles := []RoleCase12{
	//	{Name: "管理员"},
	//	{Name: "编辑"},
	//	{Name: "游客"},
	//}
	//db.Create(&roles)
	//
	//// 2. 创建用户
	//users := []UserCase12{
	//	{Name: "张三"},
	//	{Name: "李四"},
	//	{Name: "王五"},
	//}
	//db.Create(&users)
	//
	//// 3. 建立关联关系
	//userRoles := []UserRoleCase12{
	//	{UserID: users[0].ID, RoleID: roles[0].ID}, // 张三 - 管理员
	//	{UserID: users[0].ID, RoleID: roles[1].ID}, // 张三 - 编辑
	//	{UserID: users[1].ID, RoleID: roles[1].ID}, // 李四 - 编辑
	//	{UserID: users[1].ID, RoleID: roles[2].ID}, // 李四 - 游客
	//	{UserID: users[2].ID, RoleID: roles[2].ID}, // 王五 - 游客
	//}
	//db.Create(&userRoles)

	//// 查询用户及关联的角色
	//var users []UserCase12
	//db.Find(&users)
	//for _, user := range users {
	//	fmt.Println(user)
	//	var roles []RoleCase12
	//	db.
	//		Joins("INNER JOIN user_role_case12 ON role_case12.id = user_role_case12.role_id ").
	//		Where("user_role_case12.user_id = ?", user.ID).
	//		Find(&roles)
	//	fmt.Printf("用户: %s, 角色: ", user.Name)
	//	for _, role := range roles {
	//		fmt.Println(role)
	//	}
	//}

	// 查询指定用户拥有的角色信息
	var mArr1 []map[string]interface{}
	db.
		Table("user_case12").
		Select("user_case12.id, user_case12.name, role_case12.id as roleId, role_case12.name as RoleName").
		Joins(`
			INNER JOIN user_role_case12 ON user_case12.id = user_role_case12.user_id
			INNER JOIN role_case12 ON role_case12.id = user_role_case12.role_id
		`).Where("user_case12.id = ? ", 2).Scan(&mArr1)

	fmt.Println(mArr1)
	//[map[RoleName:编辑 id:2 name:李四 roleId:2] map[RoleName:游客 id:2 name:李四 roleId:3]]

	fmt.Println(db)
}

// 初始化连接
func mysqlConnect() (*gorm.DB, error) {
	url := "root:123456@tcp(127.0.0.1:3306)/case1?charset=utf8mb4&parseTime=True&loc=Local"

	// 配置自定义 Logger 打印sql日志
	newLogger := logger.New(
		log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
		logger.Config{
			SlowThreshold:             time.Second, // 慢 SQL 阈值
			LogLevel:                  logger.Info, // 可以设置为不同级别 Silent-不打印任何日志 Error-只打印错误日志 Warn-打印慢查询和错误 Info-打印慢查询和错误
			IgnoreRecordNotFoundError: true,        // 忽略ErrRecordNotFound（记录未找到）错误
			Colorful:                  true,        // 彩色打印
		},
	)

	db, err := gorm.Open(mysql.Open(url), &gorm.Config{
		Logger: newLogger, // 设置 Logger
		NamingStrategy: schema.NamingStrategy{
			SingularTable: true, // 关闭默认，使用表名
		},
	})
	if err != nil {
		return nil, fmt.Errorf("mysql connect err: %v", err)
	}

	return db, nil
}

// 多对多结构体
// 用户结构体
type UserCase12 struct {
	ID   int    `gorm:"primarykey;auto_increment"`
	Name string `gorm:"type:varchar(20);unique"`
}

// 角色结构体
type RoleCase12 struct {
	ID   int    `gorm:"primarykey;auto_increment"`
	Name string `gorm:"type:varchar(20);unique"`
}

// 用户角色关系表-自定义连接表
type UserRoleCase12 struct {
	ID     int `gorm:"primarykey;auto_increment"`
	UserID int `gorm:"index"`
	RoleID int `gorm:"index"`
}
